%% @author diana
%% @doc @todo Add description to maxteilsummeR.


-module(maxteilsummeRMitZugriff).

%% ====================================================================
%% API functions
%% ====================================================================
-export([linkesRandMax/1, rechtesRandMax/1, maxTeilsummeR/1, zeitmessung/1]).



%% ====================================================================
%% Internal functions
%% ====================================================================

deleteLast(L) -> lists:sublist(L,length(L)-1).

linkesRandMax(L) -> linkesRandMax(L, 0, 0, 0).
linkesRandMax([], BischerMax, _, Zugr) -> [BischerMax, Zugr];
linkesRandMax(L, BischerMax, BischerSum, Zugr) -> case lists:sum(L) > BischerMax of
				 true -> linkesRandMax(deleteLast(L), lists:sum(L), BischerSum + lists:sum(L), Zugr + 4);
	   	     	 false -> linkesRandMax(deleteLast(L), BischerMax, BischerSum + lists:sum(L), Zugr + 3) end.
	
rechtesRandMax([H|T]) -> rechtesRandMax([H|T], 0, 0, 0).
rechtesRandMax([], BischerMax1, _, Zugr) -> [BischerMax1, Zugr];
rechtesRandMax([H|T], BischerMax1, BischerSum1, Zugr) -> case lists:sum([H|T]) > BischerMax1 of
							  true -> rechtesRandMax(T, lists:sum([H|T]), BischerSum1 + lists:sum([H|T]), Zugr + 4);
				     		  false -> rechtesRandMax(T, BischerMax1, BischerSum1 + lists:sum([H|T]), Zugr + 3) end.



maxTeilsummeR(L) -> maxTeilsummeR(L, 0).
maxTeilsummeR(L, Zugr) -> {hd(maxTeilsummeRekursiv(L, Zugr)), hd(tl(maxTeilsummeRekursiv(L, Zugr)))}.

maxTeilsummeRekursiv([], Zugr) -> [0, Zugr];
maxTeilsummeRekursiv([Elem], Zugr) -> [max(Elem,0), Zugr + 1];
maxTeilsummeRekursiv(L, Zugr) -> [hd(maxTeilsumme(teilen(L), Zugr + 2)), hd(tl(maxTeilsumme(teilen(L), Zugr + 2)))].

maxTeilsumme([H|T], Zugr) -> [max(hd(maxTeilsummeRekursiv(lists:flatten(T), Zugr + 1)), 
								 max(hd(maxTeilsummeRekursiv(H, Zugr + 1)),
								hd(rechtesRandMax(H)) + hd(linkesRandMax(lists:flatten(T))))), Zugr + 
								  hd(tl(rechtesRandMax(H))) + hd(tl(linkesRandMax(lists:flatten(T))))].

teilen(L) -> tuple_to_list(lists:split(round(length(L)/2), L)).

%% Zeitmessung
zeitmessung(File) -> timer:tc(maxteilsummeRMitZugriff,maxTeilsummeRekursiv,
							  [read_file:fileIntoIntlist(read_file:fileToString(File))]).


